LFI 2 RCE
从本地文件包含到远程代码执行
RealWorld CTF比赛期间和队友熬夜成功一血打下TP-Link摄像头,撒花兴喜🎉,但因为0day未修复的原因就暂不记录,记录下挺有意思的一道web题。
题目来源于RealWorld CTF中的The Return of One Line PHP,起初题目来源于🍊在HITCON2018出的One Line PHP Change,利用filter与session.upload构造开头@<?php文件流来进行RCE。
文件流保存
php在处理请求数据包时,若包含一个文件上传的流,那么会先将包中的文件流保存到临时目录下,并且以php+6位随机数
名称保存,经过用户编写好的代码处理完毕后,再unlink掉临时保存的文件。
详见:
PHP LFI rfc1867 temporary file
临时文件的保留
这些临时文件在被php删除前有一段空白时间
比赛时刚开始队友想到用请求无法访问的地址如https://www.google.com
来让处理超时一段时间,最终测试发现临时文件在服务器上最多能存留30s的时间,接着被php删除。
刚开始思路就是大量请求,尽可能让在30s的时间内生成大量临时文件,然后去碰撞到这些文件,但6位的随机数在30秒中碰撞实在是要太欧皇才可以。
php7的异常退出
poc:
1 | php://filter/convert.quoted-printable-encode/resource=data://,%bfAAAAAAAAAAAAAAAAAAAAAAA%ff%ff%ff%ff%ff%ff%ff%ffAAAAAAAAAAAAAAAAAAAAAAAA |
详情链接:
poc详细分析
若是能将临时文件永久保留下来,生成大量临时文件再去碰撞那么机率将会高很多。
上面的poc就可以导致php7全版本在处理时异常退出,那么临时文件就不会因为执行后面的unlink操作而被删除。
碰撞
最终花了将近39分钟碰撞到了生成的临时文件,再去包含就可以正常拿到shell了
1 | 临时文件数量 |
1 | #!/usr/bin/env python |
Like
Issue Page
No Comment Yet
Login with GitHub